package Logika;

import bluetooth.Client;
import java.io.IOException;
import java.util.Random;
import javax.microedition.lcdui.Canvas;
import javax.microedition.lcdui.Graphics;
import javax.microedition.lcdui.Image;
import javax.microedition.lcdui.game.Sprite;

/**
 *
 * @author mejcu
 */
public class Automat extends Canvas implements Runnable
{

    private Client  client;
    private Sprite  przeszkoda              =null;
    private Sprite  czolg                   =null;
    private Sprite  pocisk                  =null;
    private static  int[]   rozkladSprite   ={0,1,2,3,4,5,6,7};
    private int[][] rozkladEkran            =new int[Zmienne.SZEROKOSC][Zmienne.WYSOKOSC];
    private boolean[][] boolEkran           =new boolean[Zmienne.SZEROKOSC][Zmienne.WYSOKOSC];
    private int     postac,kierunek;
    private int     lastToken;
    private boolean isPolling;
    private long    lastPollTime;
    private int[]   randomDecision	        ={Zmienne.TURN_NORTH,Zmienne.TURN_EAST,Zmienne.TURN_SOUTH,Zmienne.TURN_WEST};
    private Random  random                  = new Random();
    private Tank    tank                    =new Tank(2,6,Zmienne.TURN_NORTH);
 
    	public Automat(Client _client)
    	{
        	try
        	{
            		setFullScreenMode(true);
                    client=_client;
            		przeszkoda=new Sprite(Image.createImage("/pics/background.png"),20,20);
            		czolg=new Sprite(Image.createImage("/pics/tank.png"), 20, 20);
            		pocisk=new  Sprite(Image.createImage("/pics/missile.png"), 20, 20);
                    przeszkoda.setFrameSequence(rozkladSprite);
        	}
        	catch(IOException e)
        	{
            		System.err.println("Niestety wystapil blad podczas inicjalizacji aplikacji");
            		System.exit(-1);
        	}
    	}

        public void start()
        {
                    isPolling=true;
                    Thread watek = new Thread(this);
                    watek.start();
        }
        
        public  void paint(Graphics g)
    	{
    		for (int i = 0; i < Zmienne.WYSOKOSC; i++)
    		{
        		for(int j=0; j<Zmienne.SZEROKOSC ; j++ )
        		{
            			postac=rozkladEkran[j][i]%10;
            			kierunek=rozkladEkran[j][i]/10;
            			switch(postac)
            			{
                			case Zmienne.TANK:
		    				setDirection(kierunek,czolg);
                    				czolg.setPosition(i*20, j*20);
                    				czolg.paint(g);
                			break;
                			case Zmienne.TANK_IN_WOOD:
		    				setDirection(kierunek,czolg);
                    				przeszkoda.setFrame(postac);
                    				przeszkoda.setPosition(i*20, j*20 );
                    				przeszkoda.paint(g);
                			break;
                			case Zmienne.MISSILE:
		    				setDirection(kierunek,pocisk);
                    				pocisk.setPosition(i*20, j*20);
                    				pocisk.paint(g);
                    			break;
                			default:
                    				przeszkoda.setFrame(postac);
                    				przeszkoda.setPosition(i*20, j*20 );
                    				przeszkoda.paint(g);
              				break;
            			}
        		}
    		}
    	}



    	public void dekodowanie(String komunikat)
    	{
        	if(komunikat.length()>7)
        	{
            		initialize(komunikat);
        	}
        	else
        	{
            		rozkladEkran[(int)komunikat.charAt(0)][(int)komunikat.charAt(1)]=(int)komunikat.charAt(2);
                    boolEkran[(int)komunikat.charAt(0)][(int)komunikat.charAt(1)]=false;
                    if(komunikat.length()==6)
                    {
            			rozkladEkran[(int)komunikat.charAt(3)][(int)komunikat.charAt(4)]=(int)komunikat.charAt(5);
                        boolEkran[(int)komunikat.charAt(3)][(int)komunikat.charAt(4)]=true;
                    }
        	}
    	}

    	private void setDirection(int direction, Sprite sprite)// Set direction of the tank using the rotate method
    	{
        	switch(direction)
        	{
            		case Zmienne.TURN_NORTH:
                		sprite.setTransform(Sprite.TRANS_NONE);
                	break;
            		case Zmienne.TURN_EAST:
                		sprite.setTransform(Sprite.TRANS_ROT90);
                	break;
            		case Zmienne.TURN_SOUTH:
                		sprite.setTransform(Sprite.TRANS_ROT180);
                	break;
           	 	case Zmienne.TURN_WEST:
                		sprite.setTransform(Sprite.TRANS_ROT270);
                	break;
        	}
    	}
    	private void initialize(String data)
    	{
        	int k=0;
        	for(int i=0 ; i < Zmienne.SZEROKOSC ; i++)
        	{
            		for(int j=0 ; j < Zmienne.WYSOKOSC ; j++ )
            		{
                		rozkladEkran[i][j]=(int)data.charAt(k++);
                        if(rozkladEkran[i][j]==Zmienne.FREE||rozkladEkran[i][j]==Zmienne.WOOD)
                            boolEkran[i][j]=true;
            		}
        	}	
    	}
    public boolean findEnemy(int i, int j, int dx, int dy)
    {
        System.out.println("Szukane wartosci na poczatku "+i+", "+j+", "+dx+", "+dy);
        i+=dx;
        j+=dy;
        while(getBool(i,j))
        {
            i+=dx;
            j+=dy;
            System.out.println("i= "+i+", j= "+j);
        }
        if(out_of_range(i, j))
            return false;
        if(rozkladEkran[i][j]%10==Zmienne.TANK||rozkladEkran[i][j]%10==Zmienne.TANK_IN_WOOD)
        {
            System.out.println("RozkladEkran= "+rozkladEkran[i][j]);
            return true;
        }
        return false;
    }

	public boolean getBool(int i , int j)
	{
    		if (i<0 || i>=Zmienne.SZEROKOSC || j<0 || j>=Zmienne.WYSOKOSC)
    		{
        		return false;
    		}
    		return boolEkran[i][j];
	}

    public boolean out_of_range(int i, int j)
    {
        if(i<0 || i>=Zmienne.SZEROKOSC || j<0 || j>=Zmienne.WYSOKOSC)
            return true;
        return false;
    }

    public void stop()
    {
        isPolling=false;
    }


    public void run()
    {
        String komunikat="";
        long diff;
        while(isPolling)
        {
            diff=System.currentTimeMillis()-lastPollTime;
            if(diff>Zmienne.INTERVAL_POLL)
            {
                lastPollTime=System.currentTimeMillis();
                if(findEnemy(tank.zwrocPolozenieX(), tank.zwrocPolozenieY(), tank.getDX(),tank.getDY()))
                {
                    System.out.println("Zostalo zwrocone FIRE");
                    komunikat+=(char)Zmienne.FIRE;
                }
                else
                {
                    if(getBool(tank.zwrocPolozenieX()+tank.getDX(), tank.zwrocPolozenieY()+tank.getDY()))
                    {
                        System.out.println("Wysylam z kierunkiem");
                        komunikat+=(char)tank.zwrocKierunek();
                        tank.pobierzX(tank.getDX());
                        tank.pobierzY(tank.getDY());
                    }
                    else
                    {
                        int luckyNumber=random.nextInt(4);
                        System.out.println("Moj lucky number to "+luckyNumber);
                        komunikat+=(char)randomDecision[luckyNumber];
                        tank.pobierzZwrot(randomDecision[luckyNumber]);
                    }
                }
                client.sendData(komunikat);
                komunikat="";
            }
            else
            {
                try
                {
                    Thread.sleep(Zmienne.INTERVAL_POLL-diff);
                }
                catch(InterruptedException e)
                {
                    System.err.println("I was unable to sleep so long...");
                }
            }
        }
    }
}
